home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 015a / bootwhat.zip / S_MSDOS.C < prev    next >
C/C++ Source or Header  |  1990-12-17  |  4KB  |  164 lines

  1. /* This file contains system-specific functions for MS-DOS.
  2.  * The program pfdisk.c calls these routines.
  3.  */
  4. #include <stdio.h>
  5. #include <fcntl.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <dos.h>
  9.  
  10. #define extern
  11. #include "sysdep.h"
  12. #undef extern
  13.  
  14. int usage(prog)    /* print a usage message */
  15. char    *prog;    /* program name */
  16. {
  17.   fprintf(stderr,"Usage: %s <disk>\n", prog);
  18.   fprintf(stderr,"\twhere <disk> is a digit [0-9]\n");
  19. }
  20.  
  21. void getGeometry(name, c, h, s)
  22. char    *name;        /* device name */
  23. unsigned *c,*h,*s;    /* cyls, heads, sectors */
  24. {
  25.   int dev;    /* hard disk number */
  26.   union     REGS    regs;
  27.   struct    SREGS    sregs;
  28.   
  29.   if (name[0] < '0' ||
  30.       name[0] > '9' ||
  31.       name[1] != 0  )
  32.     {
  33.       fprintf(stderr,"%s: device name must be a digit\n", name);
  34.       return;
  35.     }
  36.   dev = (name[0] - '0');
  37.   
  38.   regs.h.ah = 8;        /* get param.    */
  39.   regs.h.dl = dev | 0x80;
  40.   
  41.   int86x(0x13,®s,®s,&sregs);
  42.   
  43.   /* Are that many drives responding? */
  44.   if (regs.h.dl <= dev ) {
  45.     fprintf(stderr,"%s: drive not found\n", name);
  46.     return;
  47.   }
  48.   if (regs.x.cflag) {
  49.     fprintf(stderr,"%s: can't get disk parameters\n", name);
  50.     return;
  51.   }
  52.   *c = ((((int) regs.h.cl << 2) & 0x300) | regs.h.ch) + 1;
  53.   *h = regs.h.dh + 1;
  54.   *s = regs.h.cl & 0x3F;
  55. }
  56.  
  57. int getFile(name, buf, len)    /* read file into buffer */
  58. char    *name, *buf;
  59. int    len;
  60. {    /* (open, read, close) */
  61.   int devfd, retval;
  62.   
  63.   devfd = open(name, O_RDONLY|O_BINARY, 0);
  64.   if (devfd < 0) {
  65.     fprintf(stderr,"%s: can't open for reading\n", name);
  66.     return(devfd);
  67.   }
  68.   retval = read(devfd, buf, len);
  69.   if (retval < 0)
  70.     fprintf(stderr,"%s: read failed\n", name);
  71.   close(devfd);
  72.   return(retval);
  73. }
  74.  
  75. int putFile(name, buf, len)    /* write buffer to file */
  76. char    *name, *buf;
  77. int    len;
  78. {    /* (open, write, close) */
  79.   int devfd, retval;
  80.   
  81.   devfd = open(name,
  82.            O_WRONLY|O_CREAT|O_BINARY,
  83.            S_IREAD|S_IWRITE ); /* stupid DOS... */
  84.   if (devfd < 0) {
  85.     fprintf(stderr,"%s: can't open for writing\n", name);
  86.     return(devfd);
  87.   }
  88.   retval = write(devfd, buf, len);
  89.   if (retval < 0)
  90.     fprintf(stderr,"%s: write failed\n", name);
  91.   close(devfd);
  92.   return(retval);
  93. }
  94.  
  95. int getBBlk(name, buf)    /* read boot block into buffer */
  96. char    *name, *buf;
  97. {    /* BIOS absolute disk read */
  98.   int dev;
  99.   union     REGS    regs;
  100.   struct    SREGS    sregs;
  101.   
  102.   if (name[0] < '0' ||
  103.       name[0] > '9' ||
  104.       name[1] != 0  )
  105.     {
  106.       fprintf(stderr,"%s: device name must be a digit\n",name);
  107.       return(-1);
  108.     }
  109.   dev = (name[0] - '0');
  110.   
  111.   segread(&sregs);    /* get ds */
  112.   sregs.es = sregs.ds;    /* buffer address */
  113.   regs.x.bx = (int) buf;
  114.   
  115.   regs.h.ah = 2;        /* read        */
  116.   regs.h.al = 1;        /* sector count    */
  117.   regs.h.ch = 0;        /* track    */
  118.   regs.h.cl = 1;        /* start sector    */
  119.   regs.h.dh = 0;        /* head        */
  120.   regs.h.dl = dev|0x80;    /* drive    */
  121.   
  122.   int86x(0x13,®s,®s,&sregs);
  123.   if (regs.x.cflag) {
  124.     fprintf(stderr,"%s: read failed\n", name);
  125.     return(-1);
  126.   }
  127.   return(SECSIZE);
  128. }
  129.  
  130. int putBBlk(name, buf)    /* write buffer to boot block */
  131. char    *name, *buf;
  132. {    /* BIOS absolute disk write */
  133.   int dev;
  134.   union     REGS    regs;
  135.   struct    SREGS    sregs;
  136.   
  137.   if (name[0] < '0' ||
  138.       name[0] > '9' ||
  139.       name[1] != 0  )
  140.     {
  141.       fprintf(stderr,"%s: device name must be a digit\n", name);
  142.       return(-1);
  143.     }
  144.   dev = (name[0] - '0');
  145.   
  146.   segread(&sregs);    /* get ds */
  147.   sregs.es = sregs.ds;    /* buffer address */
  148.   regs.x.bx = (int) buf;
  149.   
  150.   regs.h.ah = 3;        /* write    */
  151.   regs.h.al = 1;        /* sector count    */
  152.   regs.h.ch = 0;        /* track    */
  153.   regs.h.cl = 1;        /* start sector    */
  154.   regs.h.dh = 0;        /* head        */
  155.   regs.h.dl = dev|0x80;    /* drive    */
  156.   
  157.   int86x(0x13,®s,®s,&sregs);
  158.   if (regs.x.cflag) {
  159.     fprintf(stderr,"%s: write failed\n",name);
  160.     return(-1);
  161.   }
  162.   return(SECSIZE);
  163. }
  164.